package com.we.es.support.annotation;

import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * 索引字段注解
 * <p>
 * 关于分词、索引、和存储
 * 一、一个属性(域)，只有被索引了才可以用于搜索,
 * 分词的属性可以基于部分匹配查找，而不分词的属性，比如Id，则必须完全匹配才能找到.
 * <P>
 * 二、_source字段存储了原始数据(默认)。当然可以通过设置其属性值来选择不存储。此外，还可以通过store选择是否额外存储某个字段。store属性默认为false,表示不存储。当设置为true时，会在_source之外独立存储。
 * 此时，搜索时，会绕过_source，单独进行一次IO得到该字段的值。store会严重影响搜索效率，尽管如此，在以下两种情况下，还是可以选择使用：
 * 
 * 1：字段很长，每次检索_source代价很大。
 * 2：需要单独对某些字段进行索引重建。
 * 
 * 也就是说分词与否关系到'部分匹配还是全字匹配',索引与否关系到'是否用于检索',存储与否关系到'是否独立存储'
 * 
 * <P>
 * 注意:如果entity的字符串属性不添加注解的话，则使用的是elasticsearch默认的分词方式(比如'数据结构'会被分词为'数','据','结','构')，
 * 要使用ik_max_word的话必须添加注解。
 * 
 * 默认分词,索引,不存储
 *
 * @author   朱晓川
 * @Date	 Aug 4, 2014 	 
 */
@Target({ FIELD, METHOD })
@Retention(RUNTIME)
public @interface IndexField {

	/**
	 * 是否需要分词
	 * <p>
	 * 默认分词
	*/
	boolean needAnalyse() default true;

	/**
	 * 是否需要索引
	 * <p>
	 * 默认需要索引
	 */
	boolean index() default true;

	/**
	 * 是否需要存储
	 * <p>
	 * 默认不需要存储
	*/
	boolean store() default false;

	/**
	 * 是否做高亮处理
	 * <p>
	 * 只会在查询的时候使用，如果每次查询高亮处理的字段不一样，则自定义一些query-entity进行设置即可@see SolrIndexEntity
	 */
	boolean highLight() default false;

	/**
	 * 一个域(字段)的默认权重值
	 */
	public float boost() default 1.0F;

}
